/**
 * OSChina 上动弹的辅助工具！
 * 
 * 有时候在其他地方看到什么好的笑话或者图片分享给OSC上的小伙伴不是很方便，有了这个小工具以后呢，就方便很多了哦！^-^
 * 前提是 已经成功登入 OSChina
 * 看到喜欢的文字 直接 选中 -> 右键 -> 点按钮 '将...发送到动弹' 就OK了。图片也一样。
 * 有兴趣的小伙伴可以一起来完善下这个Chrome扩展的功能！
 */

;(function () {
	var ReUserCode = /<input type='hidden' name='user_code' value='([^']+)'\/>/,
	ReUserID = /<input type='hidden' name='user' value='(\d+)'\/>/;

	var iUserID = null,
	sUserCode = null;
	/** 初始化 获取userid user_code */
	function init() {
		if (iUserID !== null || sUserCode !== null) {
			return;
		}
		XHR.async = false;
		XHR.get('http://www.oschina.net/', function (html) {
			var M = html.match(ReUserCode);
			if (!M) {
				throw 'Error';
			}
			sUserCode = M[1];
			M = html.match(ReUserID);
			if (!M) {
				throw 'Error';
			}
			iUserID = M[1];
		});
		XHR.async = true;
	}
	/** 发送选中的文字到动弹 */
	function publishTextTweet(info, tab) {
		publishTweet(info.selectionText, 0);
	}
	/** 发送选中的图片到动弹 */
	function publishImageTweet(info, tab) {
		var detail = '#分享图片#';
		re = /undefined/
		if(!re.test(info.selectionText)) detail = info.selectionText;
		try {
			init();
		} catch (e) {
			return;
		}
		XHR.post('http://my.oschina.net/action/tweet/insert_img?user=' + iUserID, {
			source : 2,
			url : info.srcUrl
		}, function (d) {
			var J = JSON.parse(d);
			publishTweet(detail, J.id);
		});
	}
	/** 发送动弹 */
	function publishTweet(content, img) {
		try {
			init();
		} catch (e) {
			return;
		}
		var action = 'http://my.oschina.net/action/tweet/pub';
		var o = {
			user : iUserID,
			user_code : sUserCode,
			attachment : img,
			msg : content
		};
		XHR.post(action, o, function (d) {
			// console.log(d);
		});
	}

	/** 添加右键菜单按钮, 在选中文字或者图片上单击右键时显示的按钮 */
	["selection", "image"].forEach(function (c) {
		chrome.contextMenus.create({
			"title" : ({
				selection : '将“%s”发送到动弹',
				image : "将图片发送到动弹"
			})[c],
			"contexts" : [c],
			"onclick" : c === 'image' ? publishImageTweet : publishTextTweet
		});
	});

	var XHR = {
		async : true,
		get : function (url, callback) {
			this._request('GET', url, null, callback);
		},
		post : function (url, data, callback) {
			this._request('POST', url, this.serialize(data), callback);
		},
		_request : function (method, url, data, callback) {
			var xhr = new XMLHttpRequest();
			xhr.onreadystatechange = function () {
				if (xhr.readyState == 4 && xhr.status == 200) {
					typeof callback == "function" && callback.call(xhr, xhr.responseText);
				}
			};
			xhr.open(method, url, this.async);
			if (method === 'POST') {
				xhr.setRequestHeader('Content-Type', 'application/x-www-form-urlencoded');
			}
			xhr.setRequestHeader("X-Requested-With", "XMLHttpRequest");
			xhr.setRequestHeader("X-Requested-Discription", "For-OSChine-From-Jackin");
			xhr.send(data);
		},
		serialize : function (d) {
			if (Object.prototype.toString.call(d) !== "[object Object]") {
				return d;
			}
			var q = [];
			for (var k in d) {
				(typeof d[k] !== "object") && q.push([encodeURIComponent(k), encodeURIComponent(d[k])].join('='));
			}
			return q.join('&');
		}
	};
})();